package py.progweb.sgc.gui.client.dialog;

import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Vector;

import py.progweb.sgc.gui.client.service.ABMService;
import py.progweb.sgc.gui.client.service.ABMServiceAsync;
import py.progweb.sgc.gui.client.service.DialogModelService;
import py.progweb.sgc.gui.client.service.DialogModelServiceAsync;
import py.progweb.sgc.gui.shared.dialogmodel.DataRecord;
import py.progweb.sgc.gui.shared.dialogmodel.ProductosModel;
import py.progweb.sgc.model.EntidadBase;
import py.progweb.sgc.model.Producto;
import py.progweb.sgc.model.Proveedor;

import com.google.gwt.core.client.GWT;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.smartgwt.client.types.MultipleAppearance;
import com.smartgwt.client.widgets.form.DynamicForm;
import com.smartgwt.client.widgets.form.fields.IntegerItem;
import com.smartgwt.client.widgets.form.fields.SelectItem;
import com.smartgwt.client.widgets.form.fields.TextItem;

public class FormularioProveedores extends FormularioBase {

	Proveedor proveedor = new Proveedor();
	TextItem codProveedorPk, nombre, apellido, direccion, telefono;
	IntegerItem cedula;
	SelectItem productos;
	ABMServiceAsync abmService;
	DialogModelServiceAsync service;
	List<DataRecord> listProductos;
	DynamicForm otroForm;
	String[] defaultValues;

	public FormularioProveedores(VentanaBase padre) {
		super("Proveedor", padre);

		codProveedorPk = new TextItem();
		codProveedorPk.setTitle("codProveedorPk");
		codProveedorPk.setDisabled(true);

		cedula = new IntegerItem();
		cedula.setTitle("Cedula");
		cedula.setRequired(true);

		nombre = new TextItem();
		nombre.setTitle("Nombre");
		nombre.setRequired(true);

		apellido = new TextItem();
		apellido.setTitle("Apellido");
		apellido.setRequired(true);

		direccion = new TextItem();
		direccion.setTitle("Direccion");
		direccion.setRequired(false);

		telefono = new TextItem();
		telefono.setTitle("Telefono");
		telefono.setRequired(false);

		productos = new SelectItem();
		productos.setTitle("Productos");
		productos.setMultiple(true);
		productos.setMultipleAppearance(MultipleAppearance.PICKLIST);
		productos.setRequired(true);

		abmService = GWT.create(ABMService.class);
		service = GWT.create(DialogModelService.class);
		final LinkedHashMap<String, String> hashMap = new LinkedHashMap<String, String>();
		service.getProductosListadoModel(new AsyncCallback<ProductosModel>() {

			@Override
			public void onFailure(Throwable arg0) {
				// TODO Auto-generated method stub
				Window.alert(arg0.getMessage());
			}

			@Override
			public void onSuccess(ProductosModel arg0) {
				// TODO Auto-generated method stub
				// LinkedHashMap<Integer, String> hashMap = new
				// LinkedHashMap<Integer,String>();
				FormularioProveedores.this.listProductos = arg0.getRecords();
				for (DataRecord item : FormularioProveedores.this.listProductos) {
					hashMap.put(item.getPK().toString(),
							item.getAtributo("nombre").toString());
					// Window.alert((String)item.getAtributo("nombre"));
				}
				FormularioProveedores.this.productos.setValueMap(hashMap);
				// FormularioProveedores.this.setItems(codProveedorPk, nombre,
				// apellido, direccion, telefono, productos);
			}

		});
		this.setItems(codProveedorPk, cedula, nombre, apellido, direccion,
				telefono, productos);

		// this.addMember(otroForm);
		// this.addMember(f);

	}

	@Override
	public void reset() {
		codProveedorPk.setValue("");
		nombre.setValue("");
		cedula.setValue("");
		apellido.setValue("");
		direccion.setValue("");
		telefono.setValue("");
	}

	@Override
	protected void guardar() {
		if (!vacio(codProveedorPk.getValue()))
			proveedor.setCodProveedorPk(Integer.parseInt(codProveedorPk
					.getValue().toString()));
		proveedor.setNombre(nombre.getValue().toString());
		proveedor.setApellido(apellido.getValue().toString());
		proveedor.setCedula(Integer.parseInt(cedula.getValue().toString()));

		if (!vacio(direccion.getValue())) {
			proveedor.setDireccion(direccion.getValue().toString());
		} else {
			proveedor.setDireccion("");
		}

		if (!vacio(telefono.getValue())) {
			proveedor.setTelefono(telefono.getValue().toString());
		} else {
			proveedor.setTelefono("");
		}

		String[] seleccionados = productos.getValues();

		List<Producto> productosList = new ArrayList<Producto>();

		for (DataRecord producto : this.listProductos) {
			for (String item : seleccionados) {
				if (item.equals(producto.getPK().toString())) {
					Producto p = new Producto();
					p.setCodProductoPk((Integer) producto.getPK());
					p.setNombre(producto.getAtributo("nombre").toString());
					p.setPrecio_actual(Integer.parseInt(producto.getAtributo(
							"precio_actual").toString()));
					p.setStock(Integer.parseInt(producto.getAtributo("stock")
							.toString()));
					p.setGanancia(Integer.parseInt(producto.getAtributo(
							"ganancia").toString()));
					productosList.add(p);
				}
			}
		}

		proveedor.setProductos(productosList);

		abmService.guardar(proveedor, callback);
	}

	public void setData(DataRecord dr) {
		codProveedorPk.setValue(dr.getAtributo("codProveedorPk").toString());
		cedula.setValue((Integer)dr.getAtributo("cedula"));
		nombre.setValue((String)dr.getAtributo("nombre"));
		apellido.setValue((String)dr.getAtributo("apellido"));
		direccion.setValue((String)dr.getAtributo("direccion"));
		telefono.setValue((String)dr.getAtributo("telefono"));
		abmService.getProductosPorProveedor(
				(Integer)dr.getAtributo("codProveedorPk"),
				new AsyncCallback<List<DataRecord>>() {

					@Override
					public void onFailure(Throwable caught) {
						// TODO Auto-generated method stub
						Window.alert(caught.getMessage());
					}

					@Override
					public void onSuccess(List<DataRecord> result) {
						// TODO Auto-generated method stub
						Vector<String> valuesVector = new Vector<String>();
						for (DataRecord r : result) {
							valuesVector.add((String) r.getPK().toString());
						}
						FormularioProveedores.this.defaultValues = new String[valuesVector
								.size()];
						valuesVector
								.copyInto(FormularioProveedores.this.defaultValues);
						/*
						 * for(String v:
						 * FormularioProveedores.this.defaultValues){
						 * Window.alert(v); }
						 */
						FormularioProveedores.this.productos
								.setValues(FormularioProveedores.this.defaultValues);
					}

				});

	}
}